/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productos.ejbs;

import entities.ProductoTalla;
import facades.ProductoTallaFacade;
import java.math.BigInteger;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import productos.exceptions.LongitudCodigoBarrasErroneaException;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadEditada;

/**
 *
 * @author damfercer
 */
@Named(value = "codigoBarraEJB")
@Stateless
public class CodigoBarraEJB {
    @Inject
    private ProductoTallaFacade productoTallaFacade;
    @Inject
    @EventoEntidadEditada
    Event<ProductoTalla> eventoProductoTallaEditado;
    private static final String codigoEstatico="8433740";
    /**
     * Creates a new instance of TraspasosEJB
     */
    public CodigoBarraEJB() {
    }
    
    public void onNuevoProductoTalla(@Observes @EventoEntidadCreada ProductoTalla pt){
        pt.setCodigoBarras(generarCodigoBarraEAN13(pt.getIdProductoTalla()));
        productoTallaFacade.edit(pt);
        eventoProductoTallaEditado.fire(pt);
        productoTallaFacade.evict(pt,pt.getIdProductoTalla());
    }
    
    
    public static BigInteger generarCodigoBarraEAN13(Integer idProductoTalla){
        StringBuilder sb=new StringBuilder();
        sb.append(codigoEstatico);
        String idProductoTallaString=idProductoTalla.toString();
        if(idProductoTallaString.length()<5){
            for(int i=idProductoTallaString.length(); i<5; i++){
                sb.append("0");
            }
        }
        sb.append(idProductoTallaString);
        sb.append(generarDigitoControl(sb.toString()));
        return new BigInteger(sb.toString());
    }
    
    public static Integer generarDigitoControl(String codigoBarras){
        Integer codigo=null;
        if(codigoBarras.length()==12){
            Integer impares=0;
            Integer pares=0;
            for (int i = 0; i < codigoBarras.length(); i=i+2) {
                impares=impares+new Integer(codigoBarras.charAt(i));
            }
            for (int i = 1; i < codigoBarras.length(); i=i+2) {
                pares=pares+new Integer(codigoBarras.charAt(i));
            }
            pares=pares*3;
            Integer sumaParesEImpares=pares+impares;
            Integer divisionSumaParesEImparesSuelo=(int)(sumaParesEImpares*1.0 / 10);
            Integer SueloMas1Por10=(divisionSumaParesEImparesSuelo+1)*10;
            codigo=SueloMas1Por10-sumaParesEImpares;
        }
        else{
            throw new LongitudCodigoBarrasErroneaException("Longitud de código de Barras no adecuada, la longitud debe ser de 12 mientras que es de "+codigoBarras.length());
        }
        return codigo;
    }
}
